Lists and Arithmetic (Lecture 5 Part 2)

مقدمة

  • المحاضرة بتتكلم عن الـ List وهي محاضره دسمه جدا ومهمه جدا مينفعش تتكروت.
  • هنفهم المحاضرة دي إزاي الـ List بتتكون من Head و Tail، وإزاي بنعمل Unification بين الـ Lists.
  • هنتعلم العمليات الأساسية على الـ Lists زي الـ Membership، الـ Append، الإضافة، الحذف، التقسيم (Decomposing)، والتباديل (Permutations).


إيه هي الـ Lists؟

أمثلة:


الـ Head والـ Tail

مثال

لو عندنا الـ List دي: [ann, tennis, tom, king]

  • **الـ Head ** هنا هو ann
  • الـ Tail هنا هو [tennis, tom, king]
|?- [a, b, c, d] = [Head | Tail].
Head = a, Tail = [b, c, d].

|?- [a] = [H | T].
H = a, T = [].   %  the Tail of one element is an Empty List

|?- [] = [H | T].
false.           %  Empty List does not have a Head or a Tail
l سحب أكتر من عنصر

نقدر نسحب أكتر من عنصر في البداية كـ Heads (يعني نعمل اتنين هيد او اكتر) ونخلي الباقي Tail:

|?- [H1, H2 | Tail] = [mia, vincent, jules, yolanda].
H1 = mia, H2 = vincent, Tail = [jules, yolanda].

الـ List Unification (التطابق)

أمثلة:

|?- [Any, list, 'of elements'] = X.
X = [Any, list, 'of elements'].

|?- [a, B, c, D] = [A, b, C, d].
A = a, B = b, C = c, D = d.

|?- [[X, a]] = [b, Y].
false.      % طول الأولى 1 (فيها ليست واحدة)، وطول التانية 2

|?- [(a+X), (Y+b)] = [(W+c), (d+b)].
W = a, X = c, Y = d.

العمليات الأساسية على الـ Lists (List Operations)

1. الـ Membership (الانتماء) member

member(X, [X | Tail]).                   
member(X, [Head | Tail]) :- member(X, Tail). 
member(X, [X | Tail]).    
member(X, [Head | Tail]) :- member(X, Tail).                
Trace (تتبع الكود)

: ?- member(b, [a, b, c]).

  • الاول بنسال :
    1. هل b هي الـ Head a؟ لأ. (بندخل في الحالة التانية وندور في الـ Tail [b, c]).
    2. هل b هي الـ Head بتاع [b, c]؟ أيوة! (هنا الـ Base case بتتحقق ويرجع true).

2. الـ Concatenation (الدمج) append

  1. الـ Base Case: لو الـ List الأولى فاضية []، يبقى لو لزقناها مع أي List تانية L هيدينا نفس الـ List التانية L.
  2. الـ Recursive Case: لو الـ List الأولى مش فاضية، بناخد الـ Head بتاعها نحطه كـ Head للناتج النهائي، ونعمل append للـ Tail بتاعها مع الـ List التانية.
append([], L, L).
append([X | L1], L2, [X | L3]) :- append(L1, L2, L3).
append([], L, L).
append([X | L1], L2, [X | L3]) :- append(L1, L2, L3).
لو مش فاهم عادي انا كمان مش فاهم
استخدامات تانية للـ append (التقسيم - Decomposing)

الحاجة المبهره هنا إنك لو عكست السؤال، هيعكس الإجابة, يعني لو إديته الناتج (الليست بعد الدمج)، هيقدر يقسملك الليست بكل الاحتمالات الممكنة:

?- append(L1, L2, [a,b,c]).
L1= [], L2 = [a,b,c];
L1= [a], L2= [b,c];
L1 = [a,b], L2 = [c];
L1 = [a,b,c], L2 = [];

3. الإضافة والحذف (Adding & Deleting)

الإضافة (Adding) add:

add(X, L, [X | L]).
% ?- add(5, [1,2], L). -> L = [5, 1, 2].

الحذف (Deleting) del:


del(X, [X | Tail], Tail).
del(X, [Y | Tail], [Y | Tail1]) :- del(X, Tail, Tail1).
del(X, [X | Tail], Tail).
del(X, [Y | Tail], [Y | Tail1]) :- del(X, Tail, Tail1).
الـ insert في أي مكان باستخدام الـ del

  • دي حاجة شبه الي عملناها في الـ append نقدر نستخدم دالة الحذف عشان نضيف عنصر X في أي مكان في الـ List.
  • الفكرة انك لو عملت: "هات لي الـ BiggerList اللي لو حذفت منها X، يتبقى لي الـ L " ( بص في المثال عشان تفهم).
insert(X, L, BiggerList) :- del(X, BiggerList, L).


4. الـ Sublist sublist

sublist(S, L) :- append(L1, L2, L), append(S, L3, L2).

الـ Sublist بتدور على الـ عناصر ورا بعض بنفس الترتيب.

مثال (1): هل دي Sublist ولا لأ؟

?- sublist([c,d,e], [a,b,c,d,e,f]).
true.

(عشان c,d,e موجودين ورا بعض).

مثال (2): العناصر موجودة بس مش ورا بعض!

?- sublist([c,e], [a,b,c,d,e,f]).
false.

(هيديك false لأن c و e مش ورا بعض في الليست الأساسية، مفصولين بـ d).


5. التباديل (Permutations) permutation

permutation([], []).
permutation([X | L], P) :- permutation(L, L1), insert(X, L1, P).

مثال (1): تباديل لعنصرين:

?- permutation([a,b], P). 
P = [a, b] ;
P = [b, a] ;
false.

مثال (2): تباديل لـ 3 عناصر:

?- permutation([red, blue, green], P). 
P = [red, blue, green]; 
P = [red, green, blue]; 
P = [blue, red, green]; 
P = [blue, green, red]; 
P = [green, red, blue]; 
P = [green, blue, red]; 
false.

Arithmetic and Lists

  1. لو عايزين نجيب طول الـ List (Length):
len([], 0).
len([_ | L], N) :- len(L, X), N is X + 1.
  1. عكس الـ List (Reverse):
    الدالة الجاهزة reverse، تعريفها:
nrev([], []).
nrev([H | T], R) :- nrev(T, RevT), append(RevT, [H], R).
  1. جمع عناصر الـ List (Sumlist):
    عشان نجمع الأرقام اللي جوه الـ List:
sumlist([], 0).
sumlist([H | T], N) :- sumlist(T, N1), N is N1 + H.
  1. اختبار إن طول الـ List زوجي (Even):
    بنسحب كل مرة عنصرين، لحد ما نوصل لقايمة فيها عنصرين أو قايمة فاضية.
even([_,_]).
even([_,_ | T]) :- even(T).

قبل ما تدخل علي المحاضره الي بعدها حل امثلة المحاضرة والسكاشن من هنا : Lecture 5 (Part 2) - Practice

Nour Eldeen Mahmoud


Powered by Forestry.md